package cn.edu.sdjzu.xg.eagle.util;

import lombok.Setter;

import java.util.List;

/**
 * @author tg.si@188.com
 * @todo
 * @since 2025/3/26 14:20
 */
@Setter
// 为 SQL 的 where 子句建模。
// 本类可以将符合条件的 json 数组转换为 where 子句，以便用于 SQL 语句的拼接
// 适合于字符型、数值型字段
// 未测试日期型、布尔型字段
public class Condition {
    // @param conditionList 多条件形成的 List 对象，元素为 Condition 类型
    // 示例[{"value":"一","key":"name","operator":"LIKE"},{"value":"9","key":"department_id","operator":"="}]
    // 如果字段为字串的，无须设置模糊查询。
    // @return 多个条件对应的 where 子句。数值型字段也使用引号包围起来。
    // 本类依赖 Fastjson
    public static String toWhereClause(List<Condition> conditionList) {
        // 以 WHERE 开头，注意前后的空格
        StringBuilder sb = new StringBuilder(" WHERE ");
        // 将字段名、操作符和字段值依次拼接为字串
        // 每个条件后面都附加" AND "，注意前后的空格
        for (Condition c : conditionList) {
            sb.append(c.getKey()).append(" ").append(c.getOperator()).append(" ");
            String value = c.getValue();
            // 如果操作符是 like，自动设置为模糊匹配
            if ("like".equalsIgnoreCase(c.getOperator())) {
                value = "%" + value + "%";
                // 把 value 值用引号包括起来
                value = TxtHelper.getSingleQuoteMarked(value);
            }
            sb.append(value);
            sb.append(" AND ");
        }
        // 把最后一个条件后面的“and ”删除（删除最后 5 个字符）
        TxtHelper.truncEnding(sb, 5);
        return sb.toString();
    }

    // 不能定义无参构造器，否则 fastjson 会使用它来创建对象。
    public Condition(String key, String operator, String value) {
        this.key = key;
        this.operator = operator;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public String getOperator() {
        return operator;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "Condition{" +
                "key='" + key + '\'' +
                ", operator='" + operator + '\'' +
                ", value='" + value + '\'' +
                '}';
    }

    private String key; // 字段名
    private String operator; // 操作符
    private String value; // 字段值
}